package daily.nov;

public class lc2257 {
    /*
    采用暴力解法，基本独立完成。但是要注意，开始上下左右检查时，要从相邻的一格开始。同时注意边界条件的判定。向上和向左检查时要k>=0
     */
    public int countUnguarded(int m, int n, int[][] guards, int[][] walls) {
        int [][] res = new int[m][n];
        for(int[] wall: walls){
            res[wall[0]][wall[1]] = 1;
        }

        for (int[] guard: guards) {//遍历每一个守卫，同时记录这个守卫的守护区域范围
            res[guard[0]][guard[1]] = 1;//此守卫已经被访问，标记
        }

        for(int[] guard: guards){
            int row = guard[0];
            int col = guard[1];

            for(int k = col-1; k >= 0; k--){//向左检查，从左边一格开始
                if (res[row][k]==0){//访问到的格子为默认0
                    res[row][k] = 2;//标记这个格子能被守护
                }else if (res[row][k]==1){//遇到了1，即其他守卫或者墙，检查停止
                    break;
                }
            }
            for(int k = col+1; k < n; k++){//向右检查,在第（n-1）列，即最后一列时，无法向右检查
                if (res[row][k]==0){
                    res[row][k] = 2;
                }else if (res[row][k]==1){
                    break;
                }
            }
            for(int k = row+1; k < m; k++){//向下检查，从下边一格开始
                if (res[k][col]==0){
                    res[k][col] = 2;
                }else if (res[k][col]==1){
                    break;
                }
            }
            for(int k = row-1; k >= 0; k--){//向上检查
                if (res[k][col]==0){
                    res[k][col] = 2;
                }else if (res[k][col]==1){
                    break;
                }
            }
        }

//        for (int i = 0; i < res.length; i++) {
//            for (int j = 0; j < res[i].length; j++) {
//                System.out.print(res[i][j]);
//            }
//            System.out.println(" ");
//        }

        int result = 0;
        for (int[] re : res) {
            for (int i : re) {
                if (i == 0) {//i=0，即这个位置不能被守卫保护
                    result++;
                }
            }
        }
        return result;
    }

    public static void main(String[] args) {
        lc2257 lc = new lc2257();
        int[][] guards1={{0,0},{1,1},{2,3}};
        int[][] walls1={{0,1},{2,2},{1,4}};
        System.out.println(lc.countUnguarded(4,6,guards1, walls1));

        int[][] guards2={{1,1}};
        int[][] walls2={{0,1},{1,0},{2,1},{1,2}};
        System.out.println(lc.countUnguarded(3,3,guards2, walls2));
    }
}
